package com.kkb.kkbportal.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.kkb.kkbcommon.exception.Asserts;
import com.kkb.kkbportal.dao.RoleMapper;
import com.kkb.kkbportal.domain.ums.Role;
import com.kkb.kkbportal.service.RoleService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 天选ywy
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {

    /**
     * 根据条件分页展示信息
     *
     * @param conditionalRole 封装了查询条件的角色信息
     * @param pageNum         页码
     * @param pageSize        条数
     * @return 查询结果
     */
    @Override
    public PageInfo<Role> selectPage(Role conditionalRole, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return new PageInfo<>(this.selectByCondition(conditionalRole));
    }

    /**
     * 新增角色
     *
     * @param role 角色对象
     */
    @Override
    public void insert(Role role) {
        Role roleExist = selectByRoleName(role.getName());
        if (ObjectUtil.isNull(roleExist)) {
            if (!this.save(role)) {
                Asserts.fail("新增失败");
            }
        }
        Asserts.fail("角色名称重复");
    }

    /**
     * 根据角色id查询角色信息
     *
     * @param id 角色id
     * @return 角色信息
     */
    @Override
    public Role selectRoleById(Long id) {
        Role role = this.getById(id);
        if (ObjectUtil.isNull(role)) {
            Asserts.fail("查无此角色");
        }
        return role;
    }

    /**
     * 根据传入的id对角色进行逻辑删除
     * todo: 逻辑删除直接delete就好！mp自动逻辑删除！
     *
     * @param id id值
     */
    @Override
    public boolean deleteById(Long id) {
        Role role = new Role().setId(id).setDeleted(1);
        return this.updateById(role);
    }

    /**
     * 通过指定条件查询角色信息
     *
     * @param conditionalRole 封装了对应条件的角色信息
     * @return 角色列表
     */
    @Override
    public List<Role> selectByCondition(Role conditionalRole) {
        return this.lambdaQuery()
                .like(StrUtil.isNotBlank(conditionalRole.getName()), Role::getName, conditionalRole.getName())
                .like(StrUtil.isNotBlank(conditionalRole.getRoleDescription()), Role::getRoleDescription, conditionalRole.getRoleDescription()).list();
    }

    /**
     * 通过角色名称来获取对应角色对象，在新增对象中使用
     *
     * @param roleName 角色名称
     * @return 角色对象
     */
    @Override
    public Role selectByRoleName(String roleName) {
        Role role = new Role();
        role.setName(roleName);
        List<Role> roles = selectByCondition(role);
        for (Role r : roles) {
            if (r.getName().equals(roleName)) {
                return role;
            }
        }
        return null;
    }
}
